/**
 * 任务调度器
 * 调用add可以添加任务，然后通知最多有两个任务同时执行
 */
class Schedule {
    constructor(limit = 2) {
        this.limit = limit;
        this.queue = [];
        this.runingCount = 0;
    }

    add(task) {
        return new Promise((resolve, reject) => {
            const wrappedTask = () => {
                this.runingCount++;
                Promise.resolve()
                .then(() => task())
                .then(result => resolve(result))
                .catch(error => reject(error))
                .finally(() => {
                    this.runingCount--;
                    this._runTask();
                })
            }

            this.queue.push(wrappedTask);
            this._runTask();
        });
    }

    _runTask() {
        if (this.runingCount === this.limit || this.queue.length === 0) {
            return;
        }
        const task = this.queue.shift();
        task();
    }
}


// 使用示例：

// 创建调度器实例，最多允许同时运行2个任务
const scheduler = new Schedule(2);

// 定义异步任务生成函数
const timeoutTask = (time, value) => () => new Promise(resolve => setTimeout(() => {
    console.log(`Task ${value} done after ${time}ms`);
    resolve(value);
}, time));

// 添加多个任务
scheduler.add(timeoutTask(1000, 'A'));
scheduler.add(timeoutTask(500, 'B'));
scheduler.add(timeoutTask(300, 'C'));
scheduler.add(timeoutTask(400, 'D'));

// 如果需要等待所有任务完成，可以都收集promise
const tasks = [
    scheduler.add(timeoutTask(1000, 'A')),
    scheduler.add(timeoutTask(500, 'B')),
    scheduler.add(timeoutTask(300, 'C')),
    scheduler.add(timeoutTask(400, 'D')),
];

Promise.all(tasks).then(results => {
    console.log('All tasks done:', results);
});

// 单独获取第一个任务的结果
scheduler.add(timeoutTask(700, 'E')).then(result => {
    console.log('Single task done:', result);
});

